home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / POP3CLI.C < prev    next >
C/C++ Source or Header  |  1997-09-07  |  5KB  |  186 lines

  1. /* Post Office Protocol (POP3) Client -- RFC1225
  2.  * Copyright 1992 William Allen Simpson
  3.  *    partly based on a NNTP client design by Anders Klemets, SM0RGV
  4.  *      and POP2 Client by Mike Stockett, WA7DYX, et alia.
  5.  */
  6. #include "global.h"
  7. #ifdef POP3CLIENT
  8. #include <time.h>
  9. #include "timer.h"
  10. #include "proc.h"
  11. #include "netuser.h"
  12. #include "files.h"
  13. #include "mailcli.h"
  14. #include "mailutil.h"
  15. #include "smtp.h"
  16. #include "md5.h"
  17. #if defined(LZW)
  18. #include "lzw.h"
  19. extern int poplzw;
  20. #endif
  21. #ifdef MSDOS
  22. #include "hardware.h"
  23. #endif
  24.  
  25.  
  26. #if !defined(_lint)
  27. static char rcsid[] OPTIONAL = "$Id: pop3cli.c,v 1.15 1997/09/07 21:18:28 root Exp root $";
  28. #endif
  29.  
  30. void
  31. pop3_job(unused,v1,p2)
  32. int unused OPTIONAL;
  33. void *v1;
  34. void *p2 OPTIONAL;
  35. {
  36. struct mailservers *np = v1;
  37. struct sockaddr_in fsocket;
  38. char buf[TLINELEN];
  39. char const *cp;
  40. char *cp2;
  41. FILE *wfp = NULLFILE;
  42. time_t t;
  43. int s = -1;
  44. int bytes;
  45. int messages;
  46. int i;
  47. #if defined(LZW)
  48. int lzwmode, lzwbits;
  49. #endif
  50.  
  51.     if (!np || !np->hostname || mailbusy (np))
  52.         return;
  53.  
  54.     if ((fsocket.sin_addr.s_addr = resolve (np->hostname)) == 0L) {
  55.         /* No IP address found */
  56.         if (Mailtrace >= 1)
  57.             log (-1, "POP3 can't resolve host '%s'", np->hostname);
  58.         start_detached_timer (&np->timer);
  59.         return;
  60.     }
  61.  
  62.     fsocket.sin_family = AF_INET;
  63.     fsocket.sin_port = IPPORT_POP3;
  64.  
  65.     s = socket (AF_INET, SOCK_STREAM, 0);
  66.     (void) sockmode (s, SOCK_ASCII);
  67.  
  68.     if (connect (s, (char *)&fsocket, SOCKSIZE) == -1) {
  69.         cp = sockerr (s);
  70.         if (Mailtrace >= 2)
  71.             log (s, "POP3 Connect failed: %s", (cp != NULLCHAR) ? cp : "" );
  72.         goto quit;
  73.     }
  74.  
  75.     log (s, "POP3 Connected to mailhost %s", np->hostname);
  76.  
  77.     /* Eat the banner */
  78.     if (mailresponse (s, buf, "banner") == -1 || buf[0] == '-')
  79.         goto quit;
  80.  
  81.     if ((cp = strchr (buf, '<')) != NULLCHAR && (cp2 = strchr (cp, '>')) != NULLCHAR) {
  82.         MD5_CTX mdContext;
  83.         char response[128], *rp;
  84.         unsigned char *dp, *ep;
  85.  
  86.         *++cp2 = '\0';
  87.         strncpy (response, cp, sizeof (response));
  88.         strcat (response, np->password);
  89.         MD5Init (&mdContext);
  90.         MD5Update (&mdContext, (unsigned char *) response, strlen (response));
  91.         MD5Final (&mdContext);
  92.         dp = mdContext.digest;
  93.         ep = dp + sizeof (mdContext.digest);
  94.         for (rp = response; dp < ep; rp += 2)
  95.             (void) sprintf (rp, "%02x", *dp++ & 0xff);
  96.         *rp = '\0';
  97.  
  98.         usprintf (s, "APOP %s %s\n", np->username, response);
  99.         if (mailresponse (s, buf, "APOP") == -1 || buf[0] == '-')
  100.             goto quit;
  101.     } else {
  102.  
  103.         usprintf(s,"USER %s\n", np->username);
  104.         if (mailresponse (s, buf, "USER") == -1 || buf[0] == '-')
  105.             goto quit;
  106.  
  107.         usprintf (s, "PASS %s\n", np->password);
  108.         if (mailresponse (s, buf, "PASS") == -1 || buf[0] == '-')
  109.             goto quit;
  110.     }
  111.  
  112.     usputs (s, "STAT\n");
  113.     if (mailresponse (s, buf, "STAT") == -1 || buf[0] == '-')
  114.         goto quit;
  115.  
  116.     rip(buf);
  117.     if (Mailtrace >= 1)
  118.         log (s, "POP3 status %s", buf);
  119.     sscanf (buf, "+OK %d %d", &messages, &bytes);
  120.  
  121. #if defined(LZW)
  122.     if (poplzw && messages) {
  123.         usprintf (s, "XLZW %d %d\n", Lzwbits, Lzwmode);
  124.         if (mailresponse(s, buf, "XLZW") == 0 && buf[0] != '-') {
  125.             lzwmode = lzwbits = 0;
  126.             sscanf (buf, "+OK lzw %d %d", &lzwbits, &lzwmode);
  127.             if (lzwmode != Lzwmode || lzwbits != Lzwbits) {
  128.                 lzwmode = LZWCOMPACT;
  129.                 lzwbits = LZWBITS;
  130.             }
  131.             lzwinit (s,lzwbits,lzwmode);
  132.         }
  133.     }
  134. #endif
  135.  
  136.     for (i = 0; i++ < messages; ) {
  137.         if ((wfp = tmpfile()) == NULLFILE) {
  138.             if (Mailtrace >= 1)
  139.                 log (s, "POP3 Cannot create tmp file");
  140.             goto quit;
  141.         }
  142.  
  143.         usprintf (s, "RETR %d\n", i);
  144.         if (mailresponse (s, buf, "RETR") == -1 )
  145.             goto quit;
  146.         if (buf[0] == '-')
  147.             continue;
  148.  
  149.         (void) time (&t);
  150.         fprintf (wfp, "From POP3@%s %s", np->hostname, ctime (&t));
  151.  
  152.         if (recvmail (s, buf, TLINELEN, wfp, Mailtrace) == -1)
  153.             goto quit;
  154.  
  155.         if (copymail (buf, TLINELEN, wfp, np->mailbox) == -1)
  156.             goto quit;
  157.         (void) fclose (wfp);
  158.  
  159.         usprintf (s,"DELE %d\n", i);
  160.         if (mailresponse (s, buf, "DELE" ) == -1 || buf[0] == '-')
  161.             goto quit;
  162.     }
  163.  
  164.     usputs (s,"QUIT\n");
  165.     (void) mailresponse (s, buf, "QUIT");
  166.  
  167.     if (messages && Mailtrace) {
  168.         if (Mailquiet == 0)
  169.             tcmdprintf ("\007");
  170.         tcmdprintf ("%u message%sarrived for %s from mailhost %s\n",
  171.             messages, (messages == 1) ? " " : "s ", np->mailbox, np->hostname);
  172.         smtptick (NULL);     /* wake SMTP to send that mail */
  173.     }
  174.  
  175. quit:
  176.     log (s,"POP3 daemon exiting");
  177.     close_s (s);
  178.  
  179.     if (wfp != NULLFILE)        /*lint !e644 */
  180.         (void) fclose (wfp);
  181.     start_detached_timer (&np->timer);
  182. }
  183.  
  184.  
  185. #endif    /* POP3CLIENT */
  186.